package main

import (
	"fmt"

	"github.com/gin-gonic/gin"

	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

// 反序列化读取配置
type Config struct {
	Port    int    `mapstructure:"port"`
	Version string `mapstructure:"version"`
	Mysql   `mapstructure:"mysql"`
}
type Mysql struct {
	Host   string `mapstructure:"host"`
	Port   int    `mapstructure:"port"`
	DbName string `mapstructure:"dbname"`
}

func main() {
	// viper 设置默认值
	viper.SetDefault("ContentDir", "./")
	// 读取配置文件
	viper.SetConfigFile("./config.yaml")  // 指定配置文件路径
	viper.SetConfigName("config")         // 配置文件名称(无扩展名)
	viper.SetConfigType("yaml")           // 如果配置文件的名称中没有扩展名，则需要配置此项
	viper.AddConfigPath("/etc/appname/")  // 查找配置文件所在的路径
	viper.AddConfigPath("$HOME/.appname") // 多次调用以添加多个搜索路径
	viper.AddConfigPath(".")              // 还可以在工作目录中查找配置

	err := viper.ReadInConfig() // 查找并读取配置文件
	if err != nil {             // 处理读取配置文件的错误
		panic(fmt.Errorf("Fatal error config file: %s \n", err))
	}
	// 实时监控配置变化，实时加载，不用程序重新启动
	viper.WatchConfig()
	viper.OnConfigChange(func(e fsnotify.Event) {
		// 配置文件发生变更之后会调用的回调函数
		fmt.Println("Config file changed:", e.Name)
	})
	// 反序列化读取
	var c Config
	err = viper.Unmarshal(&c)
	if err != nil {
		fmt.Printf("viper.Unmarshal(&c) failed,err:%v\n", err)
		return
	}
	fmt.Printf("c:%#v\n", c)
	// web 页面读取
	r := gin.Default()
	r.GET("/hello", func(c *gin.Context) {
		c.String(200, viper.GetString("version"))
	})
	r.Run(":9090")

}
